package while_lang.ast;

import java.util.Random;

import while_lang.semantics.State;

/** Subcategoría sintáctica de las expresiones de While que pueden ser asignadas,
 *  y por lo tanto figurar en la parte izquierda de una asignación. Éstas son 
 *  las variables y las referencias a arrays. 
 *  @author Leonardo Val.
 */
public abstract class Ref extends Exp {

	/** Genera una instancia aleatoria de Ref. 
	 */
	public static Ref generate(Random random, int min, int max) {
		int i = min > 0 ? random.nextInt(1) + 1 : 
			max > 0 ? random.nextInt(2) : 
			0;
		switch (i) {
			case 0: return Variable.generate(random, min, max);
			default: return Array.generate(random, min, max);
		}
	}
	
	/** Además de poder obtener valores de ellas, las referencias se pueden
	 *  asignar valores.
	 */
	public abstract Object assign(State state, Object value);
}
